跳到主要内容

5.2 计时器2bc

分支方向预测器常被设计成由程序计数器(Program Counter)和分支历史共同索引的计数器表格形式。表格中的每一项通常采用两位的状态位,因为仅使用一位状态(即仅记忆上一次分支的结果)缺乏足够的迟滞效应,导致状态容易发生频繁翻转。

一个两位饱和计数器的状态图展示如下。该计数器共有四种状态,分别表示强/弱采取(T,即分支被执行)和不采取(NT,即分支未被执行)。

alt text

一个表现相当不错的两位状态机实现是一个饱和计数器[1],这种计数器可以计数至3(或二进制表示为2'b11)或减到0(二进制为2'b00),但不会溢出循环。当分支被执行("taken")时,计数器加1;若分支未被执行("not-taken"),则计数器减1。当计数为2或3(二进制表示为2'b1x)时,预测分支将被执行。通过增加迟滞效应,可以防止在强偏向分支偶尔改变方向时预测的快速翻转,此时需要相反方向上连续两次变化才会改变预测方向。

参考文献

R. Nair, "最优的2位分支预测器", IEEE 计算机汇刊, 第44卷第5期,1995年5月。

描述

构建一个两位的饱和计数器。

当训练有效信号(train_valid)为1且分支被执行(train_taken)也为1时,计数器增加(最多增加至3)。当train_valid为1且train_taken为0时,计数器减小(至少减至0)。如果不处于训练状态(train_valid为0),计数器的值保持不变。

areset是一个异步复位信号,它将计数器重置为轻微偏向未执行(2'b01)的状态。输出state[1:0]代表两位计数器的当前值。

模块声明

module top_module(
input clk,
input areset,
input train_valid,
input train_taken,
output [1:0] state
);

做题区